package com.powerbank.user.service;

import com.powerbank.user.vo.*;

import java.math.BigDecimal;
import java.util.List;

/**
 * 优惠券服务接口
 */
public interface CouponService {

    /**
     * 获取用户可用优惠券列表
     *
     * @param userId     用户ID
     * @param applyScope 适用范围
     * @param amount     使用金额
     * @return 可用优惠券列表
     */
    List<UserCouponVO> getAvailableCoupons(Long userId, String applyScope, BigDecimal amount);

    /**
     * 获取用户所有优惠券（分页）
     *
     * @param userId 用户ID
     * @param status 优惠券状态（可选）
     * @param page   页码
     * @param size   页大小
     * @return 优惠券列表
     */
    PageResult<UserCouponVO> getUserCoupons(Long userId, Integer status, int page, int size);

    /**
     * 领取优惠券
     *
     * @param userId     用户ID
     * @param templateId 优惠券模板ID
     * @return 是否成功
     */
    boolean receiveCoupon(Long userId, Long templateId);

    /**
     * 使用优惠券
     *
     * @param userId     用户ID
     * @param couponId   优惠券ID
     * @param orderId    订单ID
     * @param orderNo    订单号
     * @param amount     订单金额
     * @return 优惠金额
     */
    BigDecimal useCoupon(Long userId, Long couponId, Long orderId, String orderNo, BigDecimal amount);

    /**
     * 计算优惠金额
     *
     * @param couponId 优惠券ID
     * @param amount   订单金额
     * @return 优惠金额
     */
    BigDecimal calculateDiscountAmount(Long couponId, BigDecimal amount);

    /**
     * 验证优惠券是否可用
     *
     * @param userId   用户ID
     * @param couponId 优惠券ID
     * @param amount   订单金额
     * @return 是否可用
     */
    boolean validateCoupon(Long userId, Long couponId, BigDecimal amount);

    /**
     * 退还优惠券（订单取消时）
     *
     * @param orderId 订单ID
     * @return 是否成功
     */
    boolean refundCoupon(Long orderId);

    /**
     * 获取可领取的优惠券模板列表
     *
     * @param userId 用户ID
     * @return 优惠券模板列表
     */
    List<CouponTemplateVO> getReceivableTemplates(Long userId);

    /**
     * 获取用户优惠券统计
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    CouponSummaryVO getCouponSummary(Long userId);

    /**
     * 自动发放新用户优惠券
     *
     * @param userId 用户ID
     * @return 发放数量
     */
    int issueNewUserCoupons(Long userId);

    /**
     * 自动发放生日优惠券
     *
     * @param userId 用户ID
     * @return 发放数量
     */
    int issueBirthdayCoupons(Long userId);

    /**
     * 兑换优惠券
     *
     * @param userId     用户ID
     * @param couponCode 兑换码
     * @return 是否成功
     */
    boolean exchangeCoupon(Long userId, String couponCode);
}